package com.atguigu.guli.service.edu;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;

/**
 * @className: CodeGenerator
 * @description: 代码生成器
 * @date: 2020/11/15
 * @author: cakin
 */
public class CodeGenerator {
    @Test
    public void genCode() {
        // 数据库前缀
        String prefix = "db191125_";
        // 模块名
        String moduleName = "edu";

        // 1 创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2 全局配置
        GlobalConfig gc = new GlobalConfig();
        // 项目路径
        String projectPath = System.getProperty("user.dir");
        // 代码生成路径
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("cakin"); // 作者
        gc.setOpen(false); // 生成后是否打开资源管理器。false：不打开资源管理器
        gc.setFileOverride(false); // 重新生成时文件是否覆盖。false：不覆盖
        gc.setServiceName("%sService"); // 去掉Service接口的首字母I
        gc.setIdType(IdType.ASSIGN_ID); // 主键策略：雪花算法
        gc.setDateType(DateType.ONLY_DATE); // 定义生成的实体类中日期类型。ONLY_DATE：java.util.date
        gc.setSwagger2(true); // 开启Swagger2模式
        mpg.setGlobalConfig(gc); // 代码生成器中注入全局配置

        // 3 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/" + prefix + "guli_" + moduleName + "?serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL); // 使用 mysql 数据库
        mpg.setDataSource(dsc); // 代码生成器中注入数据源配置

        // 4 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(moduleName); // 模块名：edu
        pc.setParent("com.atguigu.guli.service"); // 包的根路径
        pc.setController("controller"); // 控制器根目录
        pc.setEntity("entity"); // 实体类根目录
        pc.setService("service"); // 服务层根目录
        pc.setMapper("mapper"); // mapper层根目录
        mpg.setPackageInfo(pc); // 代码生成器中注入包配置

        // 5 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel); // 数据库表映射到实体的命名策略。underline_to_camel：下划线转驼峰命名
        strategy.setTablePrefix(moduleName + "_"); // 设置表前缀不生成。去掉表前缀 edu_
        strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 数据库表字段映射到实体属性的命名策略。 underline_to_camel：下划线转驼峰命名
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
        strategy.setLogicDeleteFieldName("is_deleted");// 说明逻辑删除字段名
        strategy.setEntityBooleanColumnRemoveIsPrefix(true); // 去掉布尔值的is_前缀。 例如：数据库字段 is_deleted 转化为实体类的字段后为 deleted

        // 自动填充
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT); // 数据库字段 gmt_create 在新增时候自动填充
        TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE); // 数据库字段 gmt_modified 在新增和修改时自动填充
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        strategy.setTableFillList(tableFills);

        strategy.setRestControllerStyle(true); // 设置 restful api风格控制器。表现为增加注解 @RestController
        strategy.setControllerMappingHyphenStyle(true); // url中驼峰转连字符。例如：@RequestMapping("/edu/course-description")
        mpg.setStrategy(strategy); // 代码生成器中注入策略配置

        // 下面两个配置实现实体类的继承
        // 设置BaseEntity的位置
        strategy.setSuperEntityClass("com.atguigu.guli.service.base.model.BaseEntity");
        // 填写BaseEntity中的公共字段
        strategy.setSuperEntityColumns("id", "gmt_create", "gmt_modified");
        // 6 执行
        mpg.execute();
    }
}
